适用于版本3.3.0
1 总览
The Linux Container Executor (LCE)允许在物理机或Docker镜像中运行YARN节点。
2 集群配置
为了避免启动作业时超时,需要提前将较大的镜像拉取到Docker缓存中:
1 | sudo docker pull library/openjdk:8 |
yarn-site.xml设置:
1 | <configuration> |
此外,必须有一个属主为root,权限为0400,格式为Java Properties的container-executor.cfg文件,用户设置容器执行器的属性。
常用的设置:
启用Docker支持:
容器属性:
注意:如果需要访问YARN本地目录,需要设置docker.allowed.rw-mounts
。
可选属性:
示例设置:
1 | yarn.nodemanager.linux-container-executor.group=yarn |
3 镜像要求
(1) 用户
应用属主被显式设置为容器属主。如果应用属主不是合法的容器属主,或者两者UID不同,将导致启动失败。详见ser Management in Docker Container
(2) 依赖
镜像需要包含应用所需的全部前置条件,如运行时环境、环境变量,并且需要保证版本兼容。
YARN_CONTAINER_RUNTIME_DOCKER_RUN_OVERRIDE_DISABLE
将影响命令运行行为。如果设置了EntryPoint并且设置为true,命令将传递给EntryPoint。
过大的镜像依赖将触发拉取操作,可能引起超时,需要提前缓存。
4 CGroups配置要求
Docker使用cgroups限制单一容器的资源使用。因为运行的容器属于YARN,因此–cgroup-parent可用于设置控制组。
Docker支持两种cgroups驱动,cgroupfs和systemd。但只支持cgroups启动容器,否则报错。
5 应用提交
注意:前两项必需。
6 使用Docker Bind Mounted Volume
注意:不建议绑定系统目录,可能导致信息泄漏。
设置:
管理员设置目录白名单(到父目录),使用
docker.allowed.ro-mounts
和docker.allowed.rw-mounts
应用提交者使用
YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS
设置请求的目录,只能匹配管理员的设置。
用户配置按照source:destination(:mode)
格式提交,source是物理路径,destination是镜像中映射的路径,mode是读写模式,默认为rw。mode也可以带有绑定传播选项,如shared, rshared, slave, rslave, private, or rprivate。示例:/sys/fs/cgroup:/sys/fs/cgroup:ro
7 用户管理
使用和YARN相同的did:gid组合识别用户,需要保持宿主和容器一致。
非安全模式中使用用户nobody运行进程,详见Using CGroups with YARN。在CentOS中该用户和用户组ID为99,如果在容器中对应的用户不是99,将失败或导致未知结果。
特权容器是一种例外,其将运行容器的用户映射到容器内,因此可以不用设置uid:gid匹配。
Docker不会使用容器内的/etc/passwd
或/etc/shadow
用于用户认证,需要使用以下方式:
(1) 静态用户管理
用于非安全模式中设置已知的单一用户,适用于测试环境
手动修改UID和GID:
1 | usermod -u 99 nobody |
(2) 绑定
绑定容器外部的用户配置文件/etc/passwd
和/etc/group
,需要在配置文件container-executor.cfg
属性docker.allowed.ro-mounts
中指定。提交应用时需要在YARN_CONTAINER_RUNTIME_DOCKER_MOUNTS
中包含/etc/passwd:/etc/passwd:ro,/etc/group:/etc/group:ro
局限:
- 完全覆盖容器内的用户配置
- 一次性读取,运行时不能修改
(3) SSSD
System Security Services Daemon (SSSD) 。如 LDAP和Active Directory。
1 | # 通常Linux认证模式 |
步骤:
1) 宿主
1 | # 安装软件 |
2) 容器
注意绑定目录/var/lib/sss/pipes
,因为SSSD Unix套接字在这个位置。
1 | -v /var/lib/sss/pipes:/var/lib/sss/pipes:rw |
配置:
1 | # 安装客户端 |
8 特权容器的安全考量
默认关闭了特权容器。只能对开启ENTRYPOINT的镜像开启docker.privileged-containers.enabled
,为了防止对宿主造成不良影响,对宿主的访问关闭,但可以使用root权限操作容器。
用户可以设置受信的镜像,以下library
是一个受信的镜像:
1 | [docker] |
细粒度控制,docker.privileged-containers.registries
缺省时使用docker.trusted.registries
。
1 | [docker] |
添加端口标记本地镜像,可以与远程镜像区分:
1 | docker tag centos:latest localhost:5000/centos:latest |
示例
1 | # 为本地镜像设置标签 |
受信的进行可以绑定外部的设备,如HDFS、NFS或宿主级别的Hadoop配置。
9 容器再获取需求
重启时,NodeManager通过验证容器pid是否在/proc文件系统中来确认容器是否存活。
出于安全,操作系统管理员可能开启hidepid选项,此时设置类似以下白名单,否则重启失败:
1 | proc /proc proc nosuid,nodev,noexec,hidepid=2,gid=yarn 0 0 |
10 连接受信的Docker注册点
Docker客户端命令会从默认位置NodeManager的$HOME/.docker/config.json
获取配置。因为Docker配置是受信证书存储的位置,因此使用带有安全Docker repo的LCE不推荐这种方式。
YARN-5428提供了安全提供Docker客户端配置分布式Shell。
作为临时方案,可以手动将每一个NodeManager主机上的Docker进程使用Docker登录命令登录到安全repo中。
1 | docker login [OPTIONS] [SERVER] |
注意:这种方式意味着所有的用户都可以访问安全repo。
Hadoop通过YARN服务API整合Docker受信注册。Docker注册可以存储镜像到HDFS、S3或使用CSI驱动的外部存储中。
(1) HDFS
NFS Gateway提供了将HDFS绑定为NFS绑定点的能力。
Docker注册可以使用标准的文件系统API配置写出到HDFS。
hdfs-site.xml配置:
1 | <property> |
在所有数据节点:
1 | # 以hdfs用户运行NFS Gateway |
配置Container-executor.cfg,以允许受信镜像:
1 | [docker] |
可以配置registry.json,使用YARN服务启动Docker Registry:
1 | { |
启动服务:
1 | yarn app -launch docker-registry /tmp/registry.json |
遵循Hadoop Registry DNS格式访问registry:
1 | registry.docker-registry.$USER.$DOMAIN:5000 |
当registry应用达到了STABLE状态,用户可以使用registry.docker-registry.registry.example.com:5000/
前缀推送或拉取。
(2) S3
略
11 示例配置
假设Hadoop安装在/usr/local/hadoop
,container-executor.cfg
文件中的docker.allowed.ro-mounts
已经包含/usr/local/hadoop,/etc/passwd,/etc/group
。
(1) MapReduce: 提交Pi计算任务
1 | HADOOP_HOME=/usr/local/hadoop |
注意:主节点、map和reduce任务是独立配置的。
(2) Spark: 容器中运行Spark Shell
假设Spark安装在/usr/local/spark
1 | HADOOP_HOME=/usr/local/hadoop |
(3) ENTRYPOINT支持
Hadoop 2.x引入了Docker支持,可用于在Docker容器中运行已有的Hadoop程序,整合了日志和环境设置到NodeManager中。
Hadoop 3.x支持使用ENTRYPOINT的Docker原生形式。
通过配置YARN_CONTAINER_RUNTIME_DOCKER_RUN_OVERRIDE_DISABLE
,应用可以选择使用YARN模式还是Docker模式。
在yarn-site.xml中设置环境白名单:
1 | <property> |
在yarn-env.sh中设置:
1 | export YARN_CONTAINER_RUNTIME_DOCKER_RUN_OVERRIDE_DISABLE=true |
(4) 不使用ENTRYPOINT时的YARN模式要求
1) /bin/bash
需要在容器中可用。在最小镜像中可能没有安装bash。
2) find
需要在容器中可用。
12 YARN SysFS支持
是YARN框架支持的一个用于输出集群信息的伪文件系统。输出路径为/hadoop/yarn/sysfs
。
允许开发者在没有外部服务支持的情况下,使用NodeManager REST API访问集群信息。
13 容器服务模式
运行容器,但是没有设置用户和用户组。
默认关闭。管理员可以在container-executor.cfg
设置docker.service-mode.enabled
开启。
部分示例设置如下:
1 | yarn.nodemanager.linux-container-executor.group=yarn |
应用可以在设置YARN_CONTAINER_RUNTIME_DOCKER_SERVICE_MODE
环境控制。